﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cesave.Infrastructure.Data.Core;
using Cesave.Domain.PermisosModule.Entities;
using Cesave.Domain.PermisosModule.Contracts.Secciones;
using Cesave.Infrastructure.Data.PermisosModule.Context;
using Cesave.Infrastructure.CrossCutting.Logging;
using Cesave.Domain.Core.Specification;

namespace Cesave.Infrastructure.Data.PermisosModule.Repositories
{
	public class SeccionRepository
		: GenericRepositoryEx<Seccion>, ISeccionRepository
	{
		#region Constructor

		/// <summary>
		/// 
		/// </summary>
		/// <param name="context"></param>
		/// <param name="traceManager"></param>
		public SeccionRepository(IPermisosModuleContext context, ITraceManager traceManager)
			: base(context, traceManager)
		{
		}

		#endregion

		#region ISeccionRepository Members

		/// <summary>
		/// 
		/// </summary>
		/// <param name="seccionesByModuloSpecification"></param>
		/// <returns></returns>
		public IEnumerable<Seccion> FindSeccionesByModulo(SeccionesByModuleSpecification seccionesByModuloSpecification)
		{
			if (seccionesByModuloSpecification == null)
				throw new ArgumentNullException("seccionesByModuloSpecification");
			return GetBySpec(seccionesByModuloSpecification).OrderBy(s => s.Nombre);
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="seccionesByModuloSpecification"></param>
		/// <param name="seccionesByStatusSpecification"></param>
		/// <returns></returns>
		public IEnumerable<Seccion> FindSeccionesByModuloAndStatus(SeccionesByModuleSpecification seccionesByModuloSpecification, SeccionesByStatusSpecification seccionesByStatusSpecification)
		{
			if (seccionesByModuloSpecification == null)
				throw new ArgumentNullException("seccionesByModuloSpecification");
			if (seccionesByStatusSpecification == null)
				throw new ArgumentNullException("seccionesByStatusSpecification");
			Specification<Seccion> specification = new TrueSpecification<Seccion>();
			specification &= seccionesByModuloSpecification;
			specification &= seccionesByStatusSpecification;
			return GetBySpec(specification).OrderBy(s => s.Nombre);
		}

        /// <summary>
        /// 
        /// </summary>
        /// <param name="specification"></param>
        /// <returns></returns>
        public IEnumerable<Seccion> FindSeccionesByJunta(SeccionesByJuntaSpecificacion specification)
        {
            if (specification == null)
                throw new ArgumentNullException("specification");
            return GetBySpec(specification).OrderBy(s => s.Nombre);
        }

		#endregion
    }
}